ํ๋ฐํธ์๋ ์ฑ๋ฅ API, ํนํ ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃน๋๋ค. ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ์น์ฌ์ดํธ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์.
ํ๋ฐํธ์๋ ์ฑ๋ฅ API: ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ ๋ง์คํฐํ๊ธฐ
์ค๋๋ ์ ๋์งํธ ํ๊ฒฝ์์ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋๋ฆฐ ์น์ฌ์ดํธ๋ ์ฌ์ฉ์์ ๋ถ๋ง, ๋์ ์ดํ๋ฅ , ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ผ๋ก๋ ์์ต ์์ค๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ํ๋ฐํธ์๋ ์ฑ๋ฅ API๋ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ๋ค์ํ ์ธก๋ฉด์ ์ธก์ ํ๊ณ ๋ถ์ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ, ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด ์ต์ ํํ ์ ์๋๋ก ํด์ค๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ API๋ฅผ ํ์ํ๊ณ , ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ฉ์ ์ธ ์์ ์ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ํ์์ฑ ์ดํดํ๊ธฐ
API์ ์ธ๋ถ ์ฌํญ์ ์ดํด๋ณด๊ธฐ ์ ์, ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ด ์ ์ค์ํ์ง ์ดํดํด ๋ด ์๋ค:
- ์ฌ์ฉ์ ๊ฒฝํ: ๋น ๋ฅธ ์น์ฌ์ดํธ๋ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ ธ ์ฌ์ฉ์ ๋ง์กฑ๋์ ์ฐธ์ฌ๋๋ฅผ ๋์ ๋๋ค.
- ๊ฒ์ ์์ง ์ต์ ํ (SEO): ๊ตฌ๊ธ๊ณผ ๊ฐ์ ๊ฒ์ ์์ง์ ์น์ฌ์ดํธ ์๋๋ฅผ ์์ ๊ฒฐ์ ์์๋ก ๊ณ ๋ คํฉ๋๋ค.
- ์ ํ์จ: ๋ ๋น ๋ฅธ ์น์ฌ์ดํธ๋ ์ข ์ข ๋ ๋์ ์ ํ์จ์ ๋ณด์ ๋๋ค. ์น์ฌ์ดํธ๊ฐ ๋ฐ์์ด ๋น ๋ฅด๋ฉด ์ฌ์ฉ์๊ฐ ๊ตฌ๋งค๋ฅผ ์๋ฃํ๊ฑฐ๋ ์๋น์ค์ ๊ฐ์ ํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค.
- ๋ชจ๋ฐ์ผ ์ฑ๋ฅ: ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ ์ฌ์ฉ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ชจ๋ฐ์ผ ์ฑ๋ฅ ์ต์ ํ๋ ํ์์ ์ ๋๋ค.
- ๊ธ๋ก๋ฒ ๋๋ฌ ๋ฒ์: ์ ์ธ๊ณ ๊ฐ์ง์ ์ฌ์ฉ์๋ค์ ๋ค์ํ ๋คํธ์ํฌ ํ๊ฒฝ์ ๊ฒฝํํ ์ ์์ต๋๋ค. ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ฌ์ฉ์์ ์์น์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
ํ๋ฐํธ์๋ ์ฑ๋ฅ API ์๊ฐ
ํ๋ฐํธ์๋ ์ฑ๋ฅ API๋ ์นํ์ด์ง์ ์์ธํ ์ฑ๋ฅ ์งํ์ ์ ๊ทผํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธํฐํ์ด์ค ๋ชจ์์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ํ์ด์ง ๋ก๋, ๋ฆฌ์์ค ๊ฐ์ ธ์ค๊ธฐ, ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํ ์ ์์ต๋๋ค. ์ด ์ ๋ณด๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด ์น์ฌ์ดํธ๋ฅผ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
ํต์ฌ ์ธํฐํ์ด์ค๋ window.performance๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ Performance์
๋๋ค. ์ด ์ธํฐํ์ด์ค๋ ๋ค์ํ ์ฑ๋ฅ ๊ด๋ จ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํ ๋ฉ์๋์ ์์ฑ์ ์ ๊ณตํฉ๋๋ค.
๋ด๋น๊ฒ์ด์ ํ์ด๋ฐ API: ํ์ด์ง ๋ก๋ ์ฑ๋ฅ ์ธก์
๋ด๋น๊ฒ์ด์ ํ์ด๋ฐ API๋ ํ์ด์ง ๋ก๋ ๊ณผ์ ์ ์ฌ๋ฌ ๋จ๊ณ์ ๋ํ ์์ธํ ํ์ด๋ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ง์ฐ์ด ๋ฐ์ํ๋ ์ง์ ์ ์ ํํ ์ฐพ์๋ด๊ณ ์ต์ ํ ๋ ธ๋ ฅ์ ์ง์คํ ์ ์์ต๋๋ค.
๋ด๋น๊ฒ์ด์ ํ์ด๋ฐ์ด ์ ๊ณตํ๋ ์ฃผ์ ์งํ
- navigationStart: ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง ๋ก๋๋ฅผ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- unloadEventStart: ์ด์ ํ์ด์ง์์ unload ์ด๋ฒคํธ๊ฐ ์์๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- unloadEventEnd: ์ด์ ํ์ด์ง์์ unload ์ด๋ฒคํธ๊ฐ ๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- redirectStart: ๋ฆฌ๋๋ ์ ์ด ์์๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- redirectEnd: ๋ฆฌ๋๋ ์ ์ด ๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- fetchStart: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domainLookupStart: ๋๋ฉ์ธ ์ด๋ฆ ์กฐํ๊ฐ ์์๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domainLookupEnd: ๋๋ฉ์ธ ์ด๋ฆ ์กฐํ๊ฐ ๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- connectStart: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ์ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- connectEnd: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ ์ฐ๊ฒฐ์ ์๋ฃํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- secureConnectionStart: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด์ ์ฐ๊ฒฐ ํธ๋์ ฐ์ดํฌ๋ฅผ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- requestStart: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ๋ฌธ์๋ฅผ ์์ฒญํ๊ธฐ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- responseStart: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ์ฒซ ๋ฐ์ดํธ๋ฅผ ์์ ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- responseEnd: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ ์๋ต ์์ ์ ์๋ฃํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domLoading: ๋ธ๋ผ์ฐ์ ๊ฐ HTML ๋ฌธ์ ํ์ฑ์ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domInteractive: ๋ธ๋ผ์ฐ์ ๊ฐ HTML ๋ฌธ์ ํ์ฑ์ ์๋ฃํ๊ณ DOM์ด ์ค๋น๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domContentLoadedEventStart: DOMContentLoaded ์ด๋ฒคํธ๊ฐ ์์๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domContentLoadedEventEnd: DOMContentLoaded ์ด๋ฒคํธ๊ฐ ๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domComplete: ๋ธ๋ผ์ฐ์ ๊ฐ HTML ๋ฌธ์ ํ์ฑ์ ์๋ฃํ๊ณ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ๋ก๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- loadEventStart: load ์ด๋ฒคํธ๊ฐ ์์๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- loadEventEnd: load ์ด๋ฒคํธ๊ฐ ๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
๋ด๋น๊ฒ์ด์ ํ์ด๋ฐ ๋ฐ์ดํฐ ์ ๊ทผํ๊ธฐ
performance.timing ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ด๋น๊ฒ์ด์
ํ์ด๋ฐ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค:
const navigationTiming = performance.timing;
console.log('Navigation Start:', navigationTiming.navigationStart);
console.log('Domain Lookup Time:', navigationTiming.domainLookupEnd - navigationTiming.domainLookupStart);
console.log('Connect Time:', navigationTiming.connectEnd - navigationTiming.connectStart);
console.log('Response Time:', navigationTiming.responseEnd - navigationTiming.responseStart);
console.log('DOM Interactive:', navigationTiming.domInteractive - navigationTiming.navigationStart);
console.log('DOM Complete:', navigationTiming.domComplete - navigationTiming.navigationStart);
console.log('Load Time:', navigationTiming.loadEventEnd - navigationTiming.navigationStart);
๋ด๋น๊ฒ์ด์ ํ์ด๋ฐ ๋ฐ์ดํฐ ํด์ํ๊ธฐ
๋ด๋น๊ฒ์ด์ ํ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ฉด ์น์ฌ์ดํธ ์ฑ๋ฅ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
- ๋์ DNS ์กฐํ ์๊ฐ: DNS ์ ๊ณต์ ์ฒด์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ ๋๋ฆฐ DNS ํด์์ ๋ํ๋ ๋๋ค.
- ๋์ ์ฐ๊ฒฐ ์๊ฐ: ์๋ฒ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ฌธ์ ๋ ๋๋ฆฐ TLS ํธ๋์ ฐ์ดํฌ๋ฅผ ์์ฌํฉ๋๋ค.
- ๋์ ์๋ต ์๊ฐ: ๋๋ฆฐ ์๋ฒ ์ธก ์ฒ๋ฆฌ๋ ํฐ ์๋ต ํฌ๊ธฐ๋ฅผ ๋ํ๋ ๋๋ค.
- ๋์ DOM Interactive ์๊ฐ: ๋นํจ์จ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๋ณต์กํ DOM ๊ตฌ์กฐ๋ฅผ ์์ฌํฉ๋๋ค.
- ๋์ DOM Complete ์๊ฐ: ์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ, ์คํ์ผ์ํธ์ ๊ฐ์ ๋ฆฌ์์ค์ ๋ก๋ฉ์ด ๋๋ฆฌ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
์์ : ์ต์ด ๋ฐ์ดํธ ์์ ์๊ฐ(TTFB) ๊ณ์ฐํ๊ธฐ
์ต์ด ๋ฐ์ดํธ ์์ ์๊ฐ(Time to First Byte, TTFB)์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ ๋ฐ์ดํธ๋ฅผ ์์ ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํ๋ ์ค์ํ ์งํ์ ๋๋ค. ๋ฎ์ TTFB๋ ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ํ์์ ์ ๋๋ค.
const ttfb = performance.timing.responseStart - performance.timing.navigationStart;
console.log('Time to First Byte (TTFB):', ttfb, 'ms');
๋์ TTFB๋ ๋๋ฆฐ ์๋ฒ ์ธก ์ฒ๋ฆฌ, ๋คํธ์ํฌ ์ง์ฐ ๋๋ ์๋ฒ ์ธํ๋ผ ๋ฌธ์ ๋ก ์ธํด ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฒ ๊ตฌ์ฑ์ ์ต์ ํํ๊ณ , ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋คํธ์ํฌ ์ง์ฐ์ ์ต์ํํ๋ฉด TTFB๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ฆฌ์์ค ํ์ด๋ฐ API: ๋ฆฌ์์ค ๋ก๋ ์ฑ๋ฅ ์ธก์
๋ฆฌ์์ค ํ์ด๋ฐ API๋ ์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ, ์คํ์ผ์ํธ, ํฐํธ์ ๊ฐ์ ์นํ์ด์ง์ ๊ฐ๋ณ ๋ฆฌ์์ค ๋ก๋ฉ์ ๋ํ ์์ธํ ํ์ด๋ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ค ๋ฆฌ์์ค๊ฐ ๋ก๋๋๋ ๋ฐ ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋์ง ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ฆฌ์์ค ํ์ด๋ฐ์ด ์ ๊ณตํ๋ ์ฃผ์ ์งํ
- name: ๋ฆฌ์์ค์ URL์ ๋๋ค.
- initiatorType: ๋ฆฌ์์ค ์์ฒญ์ ์์ํ ์์์ ์ ํ์
๋๋ค (์:
img,script,link). - startTime: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ์์ค ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- redirectStart: ๋ฆฌ๋๋ ์ ์ด ์์๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- redirectEnd: ๋ฆฌ๋๋ ์ ์ด ๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- fetchStart: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domainLookupStart: ๋๋ฉ์ธ ์ด๋ฆ ์กฐํ๊ฐ ์์๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- domainLookupEnd: ๋๋ฉ์ธ ์ด๋ฆ ์กฐํ๊ฐ ๋๋ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- connectStart: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ์ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- connectEnd: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ ์ฐ๊ฒฐ์ ์๋ฃํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- secureConnectionStart: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด์ ์ฐ๊ฒฐ ํธ๋์ ฐ์ดํฌ๋ฅผ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- requestStart: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ธฐ ์์ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- responseStart: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ์ฒซ ๋ฐ์ดํธ๋ฅผ ์์ ํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- responseEnd: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ ์๋ต ์์ ์ ์๋ฃํ ์์ ์ ํ์์คํฌํ์ ๋๋ค.
- duration: ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์ด ์๊ฐ์ ๋๋ค.
๋ฆฌ์์ค ํ์ด๋ฐ ๋ฐ์ดํฐ ์ ๊ทผํ๊ธฐ
performance.getEntriesByType('resource') ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ํ์ด๋ฐ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค:
const resourceTimings = performance.getEntriesByType('resource');
resourceTimings.forEach(resource => {
console.log('Resource Name:', resource.name);
console.log('Initiator Type:', resource.initiatorType);
console.log('Duration:', resource.duration, 'ms');
});
๋ฆฌ์์ค ํ์ด๋ฐ ๋ฐ์ดํฐ ํด์ํ๊ธฐ
๋ฆฌ์์ค ํ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ฉด ๋ก๋ฉ์ด ๋๋ฆฐ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๊ณ ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ์ํด ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
- ํฐ ์ด๋ฏธ์ง: ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ ์ ์ ํ ํ์ผ ํ์(์: WebP)์ ์ฌ์ฉํ์ฌ ์ต์ ํํฉ๋๋ค.
- ์ต์ ํ๋์ง ์์ ์คํฌ๋ฆฝํธ ๋ฐ ์คํ์ผ์ํธ: ์คํฌ๋ฆฝํธ์ ์คํ์ผ์ํธ๋ฅผ ์ถ์ํ๊ณ ์์ถํ์ฌ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.
- ๋ก๋ฉ์ด ๋๋ฆฐ ํฐํธ: ํฐํธ๋ฅผ ์๋ธ์ ํ ํ๊ณ font-display ์์ฑ์ ์ฌ์ฉํ์ฌ ์น ํฐํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
- ํ์ฌ ๋ฆฌ์์ค: ํ์ฌ ๋ฆฌ์์ค์ ์ฑ๋ฅ ์ํฅ์ ํ๊ฐํ๊ณ ํ์ํ ๊ฒฝ์ฐ ๋์์ ๊ณ ๋ คํฉ๋๋ค.
์์ : ๋ก๋ฉ์ด ๋๋ฆฐ ์ด๋ฏธ์ง ์๋ณํ๊ธฐ
์ด ์์ ๋ ๋ฆฌ์์ค ํ์ด๋ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉ์ด ๋๋ฆฐ ์ด๋ฏธ์ง๋ฅผ ์๋ณํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:
const resourceTimings = performance.getEntriesByType('resource');
const slowImages = resourceTimings.filter(resource => resource.initiatorType === 'img' && resource.duration > 500);
if (slowImages.length > 0) {
console.warn('Slow-loading images detected:');
slowImages.forEach(image => {
console.log('Image URL:', image.name);
console.log('Duration:', image.duration, 'ms');
});
}
๋ก๋ฉ์ด ๋๋ฆฐ ์ด๋ฏธ์ง๋ฅผ ์๋ณํ ํ์๋ ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ , ์ ์ ํ๊ฒ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ณ , ์ง์ฐ ๋ก๋ฉ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ต์ ํํ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
์ค์ ์๋๋ฆฌ์ค: ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ ์ต์ ํ
์ ์ธ๊ณ ๊ณ ๊ฐ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค:
- ์์์ ์ฌ์ฉ์์ ๋์ TTFB: ์ค๋ฆฌ์ง ์๋ฒ์ ์์์ ์ฌ์ฉ์ ๊ฐ์ ๋๋ฆฐ ์๋ฒ ์ธก ์ฒ๋ฆฌ ๋๋ ๋คํธ์ํฌ ์ง์ฐ์ ๋ํ๋ ๋๋ค.
- ๋๋ฆฌ๊ฒ ๋ก๋๋๋ ์ ํ ์ด๋ฏธ์ง: ์ด๋ฏธ์ง๊ฐ ์น์ ์ต์ ํ๋์ง ์์ ๋ก๋ฉ ์๊ฐ์ด ๊น๋๋ค.
- ์ต์ ํ๋์ง ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ: ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์ถ์ ๋ฐ ์์ถ๋์ง ์์ ํ์ผ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํฉ๋๋ค.
์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ต์ ํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค:
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN) ๊ตฌํ: ์น์ฌ์ดํธ ์ฝํ ์ธ ๋ฅผ ์ ์ธ๊ณ ์ฌ๋ฌ ์๋ฒ์ ๋ถ์ฐํ์ฌ ๋ค๋ฅธ ์ง์ญ์ ์ฌ์ฉ์ ์ง์ฐ ์๊ฐ์ ์ค์ ๋๋ค.
- ์ ํ ์ด๋ฏธ์ง ์ต์ ํ: ImageOptim ๋๋ TinyPNG์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ WebP์ ๊ฐ์ ์ ์ ํ ํ์ผ ํ์์ ์ฌ์ฉํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ์ถ์ ๋ฐ ์์ถ: UglifyJS ๋๋ Terser์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ถ์ํ๊ณ Gzip ๋๋ Brotli๋ก ์์ถํฉ๋๋ค.
- ์ด๋ฏธ์ง ์ง์ฐ ๋ก๋ฉ: ์คํฌ๋กค ํด์ผ ๋ณด์ด๋ ์ด๋ฏธ์ง์ ์ง์ฐ ๋ก๋ฉ์ ๊ตฌํํ์ฌ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค.
์ด๋ฌํ ์ต์ ํ๋ฅผ ๊ตฌํํ ํ ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋์ด ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ, ๋ ๋์ ์ ํ์จ ๋ฐ ๊ฐ์ ๋ SEO ์์๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
๋ชจ๋ฐ์ผ ์ฑ๋ฅ ์ต์ ํ
๋ชจ๋ฐ์ผ ์ฌ์ฉ์๋ ์ข ์ข ๋ฐ์คํฌํฑ ์ฌ์ฉ์์ ๋นํด ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๊ฒฝํํฉ๋๋ค. ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ๋ชจ๋ฐ์ผ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ค์์ ๋ชจ๋ฐ์ผ ์ ์ฉ ์ต์ ํ ๊ธฐ์ ๋ช ๊ฐ์ง์ ๋๋ค:
- ๋ฐ์ํ ์ด๋ฏธ์ง ์ฌ์ฉ: ๊ธฐ๊ธฐ์ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ ๊ณตํ์ฌ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋๋ ๋ฐ์ดํฐ ์์ ์ค์ ๋๋ค.
- ํฐ์น ์ต์ ํ: ๋ฒํผ๊ณผ ๋งํฌ๊ฐ ์ถฉ๋ถํ ํฌ๊ณ ๊ฐ๊ฒฉ์ด ์์ด ํฐ์น ๊ธฐ๊ธฐ์์ ์ฝ๊ฒ ํญํ ์ ์๋๋ก ํฉ๋๋ค.
- HTTP ์์ฒญ ์ต์ํ: CSS ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ฒฐํฉํ๊ณ , ์ค์ํ CSS๋ฅผ ์ธ๋ผ์ธ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , CSS ์คํ๋ผ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ ์๋ฅผ ์ค์ ๋๋ค.
- ์คํฌ๋กค ์์ด ๋ณผ ์ ์๋ ์ฝํ ์ธ ์ฐ์ ์์ ์ง์ : ํ๋ฉด์ ๋จผ์ ๋ณด์ด๋ ์ฝํ ์ธ ๋ฅผ ๋ก๋ํ์ฌ ์น์ฌ์ดํธ์ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ์ ๋์ด: ๋ค๋ฅธ ์ฑ๋ฅ API ํ์
๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ์ด ํ์์ ์ด๊ธด ํ์ง๋ง, ํ๋ฐํธ์๋ ์ฑ๋ฅ API๋ ์ฌ์ธต์ ์ธ ์ฑ๋ฅ ๋ถ์์ ์ํ ํ๋ถํ ๋ค๋ฅธ ๋๊ตฌ๋ค์ ์ ๊ณตํฉ๋๋ค:
- User Timing API: ์ฌ์ฉ์ ์ง์ ์ฑ๋ฅ ์งํ๋ฅผ ์ ์ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํ ์ ์์ต๋๋ค.
- Long Tasks API: ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ์ํฅ์ ๋ฏธ์น๋ ์ฅ๊ธฐ ์คํ ์์ ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- Paint Timing API: ์ต์ด ํ์ธํธ(FP) ๋ฐ ์ต์ด ์ฝํ ์ธ ํ ํ์ธํธ(FCP)์ ๊ฐ์ ํ์ด์ง ๋ ๋๋ง ๊ด๋ จ ์งํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Largest Contentful Paint (LCP): ๋ทฐํฌํธ์์ ๊ฐ์ฅ ํฐ ์ฝํ ์ธ ์์๊ฐ ํ์๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
- Cumulative Layout Shift (CLS): ํ์ด์ง ๋ก๋ ์ค์ ๋ฐ์ํ๋ ์๊ธฐ์น ์์ ๋ ์ด์์ ์ด๋์ ์์ ์ธก์ ํฉ๋๋ค.
- Event Timing API: ํด๋ฆญ ๋ฐ ํค ๋๋ฆ ์ด๋ฒคํธ์ ๊ฐ์ ํ์ด์ง์์ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ๋ํ ์์ธํ ํ์ด๋ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฑ๋ฅ ๋ฐ์ดํฐ ๋ถ์ ๋๊ตฌ
์ฌ๋ฌ ๋๊ตฌ๊ฐ ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค:
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ: ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ๋ ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฌํ๊ณ , ๋คํธ์ํฌ ์์ฒญ์ ๋ถ์ํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ ์ ์๋ ๋ด์ฅ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- WebPageTest: ๋ค๋ฅธ ์์น์ ๋ธ๋ผ์ฐ์ ์์ ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ํ ์คํธํ ์ ์๋ ๋ฌด๋ฃ ์จ๋ผ์ธ ๋๊ตฌ์ ๋๋ค.
- Lighthouse: ์น ํ์ด์ง์ ํ์ง์ ํฅ์์ํค๊ธฐ ์ํ ์คํ ์์ค ์๋ํ ๋๊ตฌ์ ๋๋ค. ์ฑ๋ฅ, ์ ๊ทผ์ฑ, ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ, SEO ๋ฑ์ ๋ํ ๊ฐ์ฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Google PageSpeed Insights: ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ๋ถ์ํ๊ณ ๊ฐ์ ์ ์ํ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํ๋ ๋ฌด๋ฃ ์จ๋ผ์ธ ๋๊ตฌ์ ๋๋ค.
- New Relic, Datadog ๋ฐ ๊ธฐํ APM ๋๊ตฌ: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์ธํ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์น ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ค์์ ์น ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค:
- HTTP ์์ฒญ ์ต์ํ: CSS ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ฒฐํฉํ๊ณ , CSS ์คํ๋ผ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ค์ํ CSS๋ฅผ ์ธ๋ผ์ธ์ผ๋ก ์ฒ๋ฆฌํ์ฌ HTTP ์์ฒญ ์๋ฅผ ์ค์ ๋๋ค.
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN) ์ฌ์ฉ: ์น์ฌ์ดํธ ์ฝํ ์ธ ๋ฅผ ์ ์ธ๊ณ ์ฌ๋ฌ ์๋ฒ์ ๋ถ์ฐํ์ฌ ๋ค๋ฅธ ์ง์ญ์ ์ฌ์ฉ์ ์ง์ฐ ์๊ฐ์ ์ค์ ๋๋ค.
- ์ด๋ฏธ์ง ์ต์ ํ: ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ , ์ ์ ํ ํ์ผ ํ์(์: WebP)์ ์ฌ์ฉํ๋ฉฐ, ๋ฐ์ํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- CSS ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ถ์ ๋ฐ ์์ถ: CSS ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ถ์ํ๊ณ ์์ถํ์ฌ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์บ์ฑ ํ์ฉ: ์๋ฒ๊ฐ ์ ์ ํ ์บ์ ํค๋๋ฅผ ์ค์ ํ๋๋ก ๊ตฌ์ฑํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ ๋ฆฌ์์ค๋ฅผ ์บ์ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์น ํฐํธ ์ต์ ํ: ์น ํฐํธ๋ฅผ ์๋ธ์ ํ ํ๊ณ , font-display ์์ฑ์ ์ฌ์ฉํ๋ฉฐ, ์์ฒด ๋๋ฉ์ธ์์ ํฐํธ๋ฅผ ํธ์คํ ํฉ๋๋ค.
- ์ค์ํ์ง ์์ ๋ฆฌ์์ค์ ๋ก๋ฉ ์ง์ฐ: ์คํฌ๋กค ํด์ผ ๋ณด์ด๋ ์ด๋ฏธ์ง์ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๊ณ ์ค์ํ์ง ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ฉ์ ์ง์ฐ์ํต๋๋ค.
- ์ ๊ธฐ์ ์ธ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ํ๋ฐํธ์๋ ์ฑ๋ฅ API ๋ฐ ๊ธฐํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ์๋ณํ๊ณ ํด๊ฒฐํฉ๋๋ค.
๊ฒฐ๋ก
ํ๋ฐํธ์๋ ์ฑ๋ฅ API, ํนํ ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฆฌ์์ค ํ์ด๋ฐ API๋ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ API๋ฅผ ์ดํดํ๊ณ ํ์ฉํจ์ผ๋ก์จ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ , ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ์ํด ์น์ฌ์ดํธ๋ฅผ ์ต์ ํํ๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์ต์ ํ ์ ๋ต์ ์กฐ์ ํ์ฌ ๊ฒฝ์์์ ์์๋๊ฐ๊ณ ๋น ๋ฅด๊ณ ๋ฐ์์ด ์ข์ผ๋ฉฐ ๋งค๋ ฅ์ ์ธ ์จ๋ผ์ธ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.